#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       ficheros.py
#       
#VERSION 0.2 27.05.2012 18:27:36
"""Todo lo relacionado con el tratamiento de ficheros"""
from carta import Carta #modulo propio
import random
import csv
import os
from textos import *
    
class IO_control(object):
    """Relacionado con al escritura/lectura de archivos"""
    def __init__(self):
        pass
            
    def obtener_carta(self, ruta): 
        """Obtiene una carta del archivo .csv de manera aleatorea o por 
        nombre"""

        #  @return  una Carta(objeto)
     
        #variables
        atributos = []
        contador = 0
        salir = False
    
        #Codigo
        try:
            handler = open(ruta)
            cant_cartas = len(handler.readlines())
            csv_cartas = csv.reader(open(ruta), delimiter = ";")
        except IOError:
            raise IOError("A ocurrido un error mientras se intentaba abrir el\
            archivo de cartas")
        
        #Devuelve carta aleatoria
        try:
            while salir != True:
                n_aleatorio = random.randint(0, cant_cartas-1)
                for nombre, norte, sur, este, oeste in csv_cartas:
                    if  contador == n_aleatorio and (nombre != None):
                        salir = True
                        atributos = []
                        atributos.append(nombre)
                        atributos.append(norte)
                        atributos.append(sur)
                        atributos.append(este)
                        atributos.append(oeste)
                        break
                    contador +=1
            csv_cartas = csv.reader(open(ruta), delimiter = ";")
            contador = 0
            return Carta(atributos)
        except:
            print "Un error inesperado ah ocurrido al obtener una carta!"

    def guardar_cartas(self, ruta_dueno, cartas):
        """Guarda las cartas del mazo en un archivo, con formato csv"""
        archivo_mazo = file
        try:
            archivo_mazo = open(ruta_dueno, "w")
            csv_mazo = csv.writer(archivo_mazo, delimiter=";")
        except IOError:
            raise "Ocurrio un error mientras se intentaba abrir el fichero, para guardar las cartas"
        for indice in range(len(cartas)):
            csv_mazo.writerow([cartas[indice].nombre, cartas[indice].norte, cartas[indice].sur, cartas[indice].este, cartas[indice].oeste])
        archivo_mazo.close()

    def quitar_cartas(self, ruta_dueno, mano):
        """Borra las cartas especificadas, del archivo mazo del jugador"""
        cartas_mazo = [] #sera una lista de listas
        cartas_mano = []
        cartas_mazo_salida = []
        norte = sur = este = oeste = carta = ""
        try:
            #primero obtengo las cartas del archivo mazo
            archivo_mazo = open(ruta_dueno, "r")
            csv_mazo = csv.reader(archivo_mazo, delimiter=";")
            for carta, norte, sur, este, oeste in csv_mazo:
                cartas_mazo.append([carta, norte,sur, este, oeste]) #lista de atributos de cartas en el maso actual
            
            for carta in mano: #obtiene los nombre de las cartas de la mano
                cartas_mano.append(carta.nombre)
            
            #Ahora desecho todas las cartas que tengo en la mano, del mazo
            for indice, carta in enumerate(cartas_mazo): #solo recorro los nombres
                if carta[0] not in cartas_mano:
                    cartas_mazo_salida.append(carta)
            archivo_mazo = open(ruta_dueno, "w") #reabro el archivo para escritura
            csv_mazo = csv.writer(archivo_mazo, delimiter=";")
            csv_mazo.writerows(cartas_mazo_salida)#Escribo todas las lineas en una sola pasada :D:D
            archivo_mazo.close()
        except IOError:
            print "Ocurrio un error intentando leer/escribir, el archivo de mazo"
            
    def entregar_cartas_aleatorias(self, ruta): #OK
            """Obtengo 50 cartas aleatorias y las devuelvo"""
            i = 0
            cartas = []
            for i in range(51):
                carta = self.obtener_carta(ruta)
                cartas.append(carta)
            if self.calcular_promedio(cartas) == False:
                self.cartas = None
                self.entregar_15_aleatorias(ruta)
                #es recursiva, pero no peligrosa, la probamos 10 veces
                #y como maximo se produjeron 3 recursividades.
            return cartas
                
    def calcular_promedio(self, cartas):
        for carta in cartas:
            suma_por_carta= int(carta.este) + int(carta.oeste) + int(carta.norte) + int(carta.sur)
            suma_por_carta += suma_por_carta
        suma_total = suma_por_carta
        promedio = float(suma_total / 15)
        if promedio > 7:
            return False 
    
